package com.zxp.common.codegen.util;

import com.zxp.common.codegen.constant.DbType;
import com.zxp.common.codegen.pojo.DataBase;
import com.zxp.common.codegen.pojo.Settings;
import com.zxp.common.codegen.pojo.Table;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 1.采集用户UI界面输入的数据
 *      模板位置
 *      代码生成路径
 *      工程配置对象 setting
 *      数据库对象   DataBase
 * 2.准备数据模型
 *      1.自定义配置
 *      2.元数据
 *      3.setting
 * 3.调用核心处理类完成代码生成工作
 *      方法：Generator
 */
@Slf4j
public class GeneratorFacade {

    private String templatePath;
    private String outPath;
    private Settings settings;
    private DataBase db;
    private Generator generator;

    @SneakyThrows
    public GeneratorFacade(String templatePath, String outPath, Settings settings, DataBase db) {
        this.templatePath = templatePath;
        this.outPath = outPath;
        this.settings = settings;
        this.db = db;
        this.generator = new Generator(templatePath,outPath);
    }

    /**
     * 1.准备数据模型
     * 2.调用核心处理类完成代码生成工作
     */
    @SneakyThrows
    public void generatorByDataBase(){
        List<Table> tables = DataBaseUtil.getDbInfo(db,null,null,null);
        for (Table table : tables) {
            //对每一个Table对象进行代码生成
            /**
             * 数据模型
             * 调用Generator核心处理类
             */
            Map<String,Object> dataModel = getDataModel(table);
            for(Map.Entry<String,Object> entry:dataModel.entrySet()) {
                log.debug(entry.getKey() + "--" + entry.getValue());
            }
            log.debug("-----------getDataModel 完成-------------");
            generator.scanAndGenerator(dataModel);
        }
    }

    /**
     * 代码生成器
     * @param tablePrefix  要去掉的表前缀, 默认的表前缀就不会执行
     * @param convertMap  数据模型， 会覆盖默认的数据模型
     * @param tables 哪些表需要生成
     */
    @SneakyThrows
    public void generatorByDataBase(String[] tablePrefix, Map<String,String> convertMap, String[] tables){
        List<Table> tableList = DataBaseUtil.getDbInfo(db,tablePrefix,convertMap,tables);
        for (Table table : tableList) {
            //对每一个Table对象进行代码生成
            /**
             * 数据模型
             * 调用Generator核心处理类
             */
            Map<String,Object> dataModel = getDataModel(table);
            for(Map.Entry<String,Object> entry:dataModel.entrySet()) {
                log.debug(entry.getKey() + "--" + entry.getValue());
            }
            log.debug("-----------getDataModel 完成-------------");
            generator.scanAndGenerator(dataModel);
        }
    }

    /**
     * 根据table对象获取数据模型
     */
    private  Map<String,Object> getDataModel(Table table) {
        Map<String,Object> dataModel = new HashMap<>();
        //1.自定义配置
        dataModel.putAll(PropertiesUtils.customMap);
        //2.元数据
        dataModel.put("table",table);  //table.name2
        //3.setting
        dataModel.putAll(this.settings.getSettingMap());
        //4.类型
        dataModel.put("ClassName", table.getName2());
        //5.添加数据库信息
        dataModel.put("username", db.getUsername());
        dataModel.put("password", db.getPassword());
        dataModel.put("url", db.getUrl());
        dataModel.put("driver", db.getDbType().getDriverClass());
        dataModel.put("author", settings.getAuthor());

        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = simpleDateFormat.format(date);
        dataModel.put("createTime", str);

        return dataModel;
    }

    public static void main(String[] args) {
        //String templatePath= GeneratorFacade.class.getClass().getResource("/tpl/Springboot").getPath();
        String templatePath= "D:\\ideaWorkspace\\zxpnet\\springboot2-lesson\\zxp-common\\zxp-common-codegen\\target\\classes\\tpl";
        String outPath="d:\\dd\\";
        log.info("模板路径："+ templatePath);
        Settings settings = new Settings("zxpx","com.zxp.test","zxpx测试系统","shollin");

        DataBase database = new DataBase(DbType.MYSQL,"localhost","jeesite");
        database.setHost("localhost");
        database.setUsername("root");
        database.setPassword("123456");

        GeneratorFacade generatorFacade = new GeneratorFacade(templatePath, outPath, settings, database);
        generatorFacade.generatorByDataBase();
    }
}
